03.2_clustering

Code
# scRNA-seq
library("SingleCellExperiment")
library("Seurat")

# Clustering trees
library("clustree")

# Plotting
library("viridis")
library("ggforce")
library("cowplot")
library(ggrepel)
library(patchwork)

# Presentation
library("knitr")

# Tidyverse
library("tidyverse")
Code
proj_dir <- "/Users/nami/Desktop/sterile_inflammation/"
plots_dir <- "/Users/nami/Desktop/sterile_inflammation/output/plots/03.2_clustering/"
sobj_dir <- "/Users/nami/Desktop/sterile_inflammation/output/processed/"
out_data_dir <- "/Users/nami/Desktop/sterile_inflammation/output/data/03.2_clustering/"

source(paste0(proj_dir,"/functions/universal.R"))
Code
# Define sample names
sample_names <- c("PVM_0h", "PVEU_0h", "PVM_4h", "PVEU_4h", "PVM_7h", "PVEU_7h")

sample_colors <- c(
  "PVM_0h"  = "#EE9A49",  
  "PVM_4h"  = "#CD853F", 
  "PVM_7h" = "#8B5A2B",  
  "PVEU_0h"  = "#7EC0EE",
  "PVEU_4h" = "#6CA6CD", 
  "PVEU_7h" = "#4A708B"
)

Introduction

After talking to Shweta and Rohit once I showed them the results from the last script (03_clustering), it was difficult to say which methods performs clustering better. To get a better idea of what each cluster is at a cell type level, I did a rough cell type annotation ans subsetted the PVM compartment for both methods. In order to streamline things, I kept the resolution for both SCTransform and Seurat VST full objects as 0.2.

Code
load(file=paste0(proj_dir,"output/processed/03_SI_seurat_sct.Robj"))
load(paste0(proj_dir,"output/processed/03_SI_seurat_vst.Robj"))
seurat_vst <- seurat
rm(seurat)

res <- 0.2
Idents(seurat_sct) <- paste0("SCT_snn_res.", res)
seurat_sct$seurat_clusters <- seurat_sct[[paste0("SCT_snn_res.", res)]]
Idents(seurat_vst) <- paste0("RNA_snn_res.", res)
seurat_vst$seurat_clusters <- seurat_vst[[paste0("RNA_snn_res.", res)]]

Compare UMAPs at 0.2 res

The following plots show what the UMAPs looks like split by seurat clusters and by sample_timepoint.

Code
p1 <- DimPlot(seurat_sct, label = TRUE) + NoAxes() + NoLegend() 
p2 <- DimPlot(seurat_sct, group.by = "orig.ident", 
              cols = sample_colors) +
  ggtitle("SCT") + NoAxes() 
p <- add_mini_axis(p1) + add_mini_axis(p2)
p 

Code
p3 <- DimPlot(seurat_vst, label = TRUE) + NoAxes() + NoLegend()
p4 <- DimPlot(seurat_vst, group.by = "orig.ident", cols = sample_colors) +
  ggtitle("VST") + NoAxes()
p <- add_mini_axis(p3) + add_mini_axis(p4)
p

Compare marker genes at 0.2 res

The marker genes for both objects are attached.

Side note about finding markers and any downstream analysis using SCTransform:

There was some confusion regarding performing DE analysis after SCTransform. In this context, I found this (https://github.com/satijalab/seurat/issues/2180 and https://github.com/satijalab/seurat/issues/2115):

“The scale.data (in SCTransform slot) is the pearson residuals that come out of regularized NB regression. The counts and data slot transforms these values back into integer values (stored in counts), and then performs a log-transformation (stored in data).

SCTransform (by default) only stores pearson residuals (scale.data) for 3,000 variable features, to save memory. When possible, we try to perform operations directly on the Pearson residuals themselves. However, these values are not sparse (contain exclusively non-zero elements), so they take a lot of memory to store, and as a result we don’t compute them for all genes by default. Unless you change the defaults in SCTransform, performing DE on the scale.data slot would only test differences in variable genes. We also find that pearson residuals are challenging to visualize/interpret on either Feature or Violin plots, and therefore find the data slot in the SCT assay quite useful for this.

So performing DE on the scale.data slot of this assay means you are only testing 3,000 genes. Performing DE on the RNA assay will test all genes.”

Therefore, I have changed the default assay to RNA, and normalized and scaled the data for markers analysis of the SCTransform object in this document.

Code
DefaultAssay(seurat_sct) <- "RNA" 
seurat_sct <- NormalizeData(seurat_sct)
seurat_sct <- ScaleData(seurat_sct)
degs_sct <- FindAllMarkers(seurat_sct, only.pos = TRUE, 
                           assay = "RNA",
                           min.pct = 0.25, logfc.threshold = 0.1)

# Extract top 20 genes for each cluster
top_genes <- degs_sct %>%
  group_by(cluster) %>%
  arrange(desc(avg_log2FC)) %>%
  slice_head(n = 20)

# Save to CSV file
write.csv(top_genes, paste0(out_data_dir,tag,"_markers_sct_res0.2.csv"), 
          row.names = FALSE)

#VST
degs_vst <- FindAllMarkers(seurat_vst, only.pos = TRUE, 
                           assay = "RNA",
                           min.pct = 0.25, logfc.threshold = 0.1)

# Extract top 20 genes for each cluster
top_genes <- degs_vst %>%
  group_by(cluster) %>%
  arrange(desc(avg_log2FC)) %>%
  slice_head(n = 20)

# Save to CSV file
write.csv(top_genes, paste0(out_data_dir,tag,"_markers_vst_res0.2.csv"), 
          row.names = FALSE)
save(seurat_sct, file="./output/processed/03.2_SI_seurat_sct.Robj")

SCT

Code
library(DT)
top_genes_sct <- read.csv(paste0(out_data_dir,tag,"_markers_sct_res0.2.csv"))

datatable(
  top_genes_sct,
  options = list(pageLength = 10, lengthMenu = c(10, 25, 50, 100)),
  rownames = TRUE
)

VST

Code
 top_genes_vst <- read.csv(paste0(out_data_dir,tag,"_markers_vst_res0.2.csv"))

datatable(
  top_genes_vst,
  options = list(pageLength = 10, lengthMenu = c(10, 25, 50, 100)),
  rownames = TRUE
)

The marker gene lists are also attached in the shared Google folder as csv files.

Rough cell type annotations

Next I did some rough cell type annotation based on markers we identified in December, 2024.

SCT

Code
load(file=paste0(proj_dir,"output/processed/03.2_SI_seurat_sct.Robj"))
features_celltypes <- c(
  "Ccr2", "Irf5", "S100a4", "Adgre1", 
  "Csf1r", "Folr2", 
  "Mmp9", "Lcn2", "Retnlg", "S100a8", 
  "Pecam1", 
  "Cldn5", "Emcn", "Sox17", 
  "Kit", "Cpa3", "Tpsb2",
  "Des", "Acta2", "Pdgfrb", 
  "Cd19", "Blk", "Cd22"
)

DefaultAssay(seurat_sct) <- "RNA" 
p1 <- DotPlot(seurat_sct, features = features_celltypes, group.by = "seurat_clusters",
        col.min = -1,
        col.max = 2,
        dot.scale = 5) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1.0, size = 12),
        axis.text.y = element_text(angle = 0, hjust = 1.0, size = 15)) +
  labs(x = NULL, y = NULL) + ggtitle("SCT")

seurat_sct@meta.data[,'celltype'] <- as.numeric(seurat_sct@active.ident)-1
seurat_sct@meta.data$celltype[which(seurat_sct@active.ident %in% c(5))] <- 'Monocytes'
seurat_sct@meta.data$celltype[which(seurat_sct@active.ident %in% c(0, 1, 8, 9))] <- 'Macrophages'
seurat_sct@meta.data$celltype[which(seurat_sct@active.ident %in% c(3))] <- 'Neutrophils'
seurat_sct@meta.data$celltype[which(seurat_sct@active.ident %in% c(6,7))] <- 'Endothelial cells'
seurat_sct@meta.data$celltype[which(seurat_sct@active.ident %in% c(12))] <- 'Mast cells'
seurat_sct@meta.data$celltype[which(seurat_sct@active.ident %in% c(2, 11))] <- 'B-cells'
seurat_sct@meta.data$celltype[which(seurat_sct@active.ident %in% c(13, 10, 4))] <- 'Unknown'
seurat_sct@meta.data$celltype[which(seurat_sct@meta.data$sample %in% c("PVM"))] <- 'PVM'

p2 <- DimPlot(seurat_sct, repel = TRUE, label = FALSE, 
        pt.size = 0.5, group.by = "celltype") + 
  NoAxes() + labs(title = NULL)
p1 + p2

Code
p3 <- DimPlot(seurat_sct, repel = TRUE, label = FALSE, 
        pt.size = 0.5, group.by = "celltype", split.by = "orig.ident") + 
  NoAxes() + labs(title = NULL)
p3

Code
p4 <- DotPlot(seurat_vst, features = features_celltypes, group.by = "seurat_clusters",
        col.min = -1,
        col.max = 2,
        dot.scale = 5) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1.0, size = 12),
        axis.text.y = element_text(angle = 0, hjust = 1.0, size = 15)) +
  labs(x = NULL, y = NULL) + ggtitle("VST")

VST

Code
seurat_vst@meta.data[,'celltype'] <- as.numeric(seurat_vst@active.ident)-1
seurat_vst@meta.data$celltype[which(seurat_vst@active.ident %in% c(3))] <- 'Monocytes'
seurat_vst@meta.data$celltype[which(seurat_vst@active.ident %in% c(0, 1, 8))] <- 'Macrophages'
seurat_vst@meta.data$celltype[which(seurat_vst@active.ident %in% c(4))] <- 'Neutrophils'
seurat_vst@meta.data$celltype[which(seurat_vst@active.ident %in% c(6,7))] <- 'Endothelial cells'
seurat_vst@meta.data$celltype[which(seurat_vst@active.ident %in% c(10))] <- 'Mast cells'
seurat_vst@meta.data$celltype[which(seurat_vst@active.ident %in% c(2))] <- 'B-cells'
seurat_vst@meta.data$celltype[which(seurat_vst@active.ident %in% c(9, 5, 12, 11))] <- 'Unknown'
seurat_vst@meta.data$celltype[which(seurat_vst@meta.data$sample %in% c("PVM"))] <- 'PVM'

p5 <- DimPlot(seurat_vst, repel = TRUE, label = FALSE, 
        pt.size = 0.5, group.by = "celltype") + 
  NoAxes() + labs(title = NULL)
p4 + p5

Code
p6 <- DimPlot(seurat_vst, repel = TRUE, label = FALSE, 
        pt.size = 0.5, group.by = "celltype", split.by = "orig.ident") + 
  NoAxes() + labs(title = NULL)
p6

Subset PVM

Next I subsetted the PVM compartment from both full objects.

SCT

Code
library(future)
oopts <- options(future.globals.maxSize = 1.0 * 1e9)  ## 1.0 GB
on.exit(options(oopts))
f <- future({ expr })

pvm_sct <- subset(seurat_sct, subset = sample == "PVM")
pvm_sct <- SCTransform(pvm_sct)
pvm_sct <- RunPCA(pvm_sct, npcs = 50)

ElbowPlot(pvm_sct)
selected_dims <- select_dims(pvm_sct, "pca")

set.seed(123)
pvm_sct <- RunUMAP(pvm_sct, dims = 1:21)
pvm_sct <- FindNeighbors(pvm_sct)
pvm_sct <- FindClusters(pvm_sct, resolution = 0.2)
save(pvm_sct, file=paste0(sobj_dir,tag,"_pvm_sct.Robj"))
Code
load(paste0(sobj_dir,tag,"_pvm_sct.Robj"))
p1 <- DimPlot(pvm_sct, group.by = "orig.ident", cols = sample_colors) + ggtitle("SCT")
p2 <- DimPlot(pvm_sct)
p1 + p2

Code
DimPlot(pvm_sct, split.by = "orig.ident")

VST

Code
library(future)
oopts <- options(future.globals.maxSize = 1.0 * 1e9)  ## 1.0 GB
on.exit(options(oopts))
f <- future({ expr })

pvm_vst <- subset(seurat_vst, subset = sample == "PVM")
pvm_vst <- NormalizeData(pvm_vst, npcs = 50)
pvm_vst <- ScaleData(pvm_vst, npcs = 50)
pvm_vst <- RunPCA(pvm_vst, npcs = 50)

ElbowPlot(pvm_vst)
selected_dims <- select_dims(pvm_vst, "pca")

set.seed(123)
pvm_vst <- RunUMAP(pvm_vst, dims = 1:16)
pvm_vst <- FindNeighbors(pvm_vst)
pvm_vst <- FindClusters(pvm_vst, resolution = 0.2)
save(pvm_vst, file=paste0(sobj_dir,tag,"_pvm_vst.Robj"))
Code
load(paste0(sobj_dir,tag,"_pvm_vst.Robj"))
p1 <- DimPlot(pvm_vst, group.by = "orig.ident", cols = sample_colors) + ggtitle("SCT")
p2 <- DimPlot(pvm_vst)
p1 + p2

Code
DimPlot(pvm_vst, split.by = "orig.ident")

#PVM Markers

Next I foudn marker genes for both subsetted PVM objects. Once again, for the SCTransform object, the assay was first changed to RNA.

Code
DefaultAssay(pvm_sct) <- "RNA" 
pvm_sct <- NormalizeData(pvm_sct)
pvm_sct <- ScaleData(pvm_sct)
degs_pvm_sct <- FindAllMarkers(pvm_sct, only.pos = TRUE, 
                           assay = "RNA",
                           min.pct = 0.25, logfc.threshold = 0.1)

# Extract top 20 genes for each cluster
top_genes <- degs_pvm_sct %>%
  group_by(cluster) %>%
  arrange(desc(avg_log2FC)) %>%
  slice_head(n = 20)

# Save to CSV file
write.csv(top_genes, paste0(out_data_dir,tag,"_pvm_markers_sct_res0.2.csv"), 
          row.names = FALSE)

#VST
degs_pvm_vst <- FindAllMarkers(pvm_vst, only.pos = TRUE, 
                           assay = "RNA",
                           min.pct = 0.25, logfc.threshold = 0.1)

# Extract top 20 genes for each cluster
top_genes <- degs_pvm_vst %>%
  group_by(cluster) %>%
  arrange(desc(avg_log2FC)) %>%
  slice_head(n = 20)

# Save to CSV file
write.csv(top_genes, paste0(out_data_dir,tag,"_pvm_markers_vst_res0.2.csv"), 
          row.names = FALSE)

SCT

Code
library(DT)
top_genes_sct <- read.csv(paste0(out_data_dir,tag,"_pvm_markers_sct_res0.2.csv"))

datatable(
  top_genes_sct,
  options = list(pageLength = 10, lengthMenu = c(10, 25, 50, 100)),
  rownames = TRUE
)

VST

Code
top_genes_vst <- read.csv(paste0(out_data_dir,tag,"_pvm_markers_vst_res0.2.csv"))

datatable(
  top_genes_vst,
  options = list(pageLength = 10, lengthMenu = c(10, 25, 50, 100)),
  rownames = TRUE
)

These files are also attached in the shared Google folder.

Selection

In the meeting on 03.03.25, we decided to go with SCT since it seems that SCTransform better captures the biological variability between different samples/time_points. To be conservative, we will keep resolution at 0.2 which gives us 13 clusters.

Validation

To validate the clusters we will repeat some of our quality control plots separated by cluster. At this stage we just want to check that none of the clusters are obviously the result of technical factors.

Code
ggplot(seurat_sct@meta.data, aes(x = seurat_clusters, fill = seurat_clusters)) +
  geom_bar() +
  labs(title = "Cluster Counts", x = "Cluster", y = "Count") +
  theme_minimal()

Code
DimPlot(seurat_sct, reduction = "pca", group.by = "seurat_clusters") +
  labs(title = "PCA by Cluster") +
  theme_minimal()

Code
DimPlot(seurat_sct, reduction = "umap", group.by = "seurat_clusters") +
  labs(title = "PCA by Cluster") +
  theme_minimal()

Code
ggplot(seurat_sct@meta.data, aes(x = seurat_clusters, fill = orig.ident)) +
  scale_fill_manual(values = sample_colors) +
  geom_bar() +
  labs(title = "Sample counts", x = "Cluster", y = "Count") +
  theme_minimal()

Code
library(dplyr)
plot_data <- seurat_sct@meta.data %>%
  count(seurat_clusters, orig.ident) %>%
  group_by(seurat_clusters) %>%
  mutate(prop = n / sum(n))

ggplot(plot_data, aes(x = seurat_clusters, y = prop, fill = orig.ident)) +
  scale_fill_manual(values = sample_colors) +
  geom_col() +
  labs(title = "Proportions by sample", x = "Cluster", y = "Proportion") +
  theme_minimal()

Code
DimPlot(seurat_sct, reduction = "pca", group.by = "orig.ident") +
  scale_color_manual(values = sample_colors) +
  labs(title = "PCA by sample") +
  theme_minimal()

Code
DimPlot(seurat_sct, reduction = "umap", group.by = "orig.ident") +
  scale_color_manual(values = sample_colors) +
  labs(title = "umap by sample") +
  theme_minimal()

Code
ggplot(seurat_sct@meta.data, aes(x = seurat_clusters, fill = SelMethod)) +
  geom_bar() +
  labs(title = "", x = "Cluster", y = "Count") +
  theme_minimal()

Code
library(dplyr)
plot_data <- seurat_sct@meta.data %>%
  count(seurat_clusters, SelMethod) %>%
  group_by(seurat_clusters) %>%
  mutate(prop = n / sum(n))

ggplot(plot_data, aes(x = seurat_clusters, y = prop, fill = SelMethod)) +
  geom_col() +
  labs(title = "", x = "Cluster", y = "Proportion") +
  theme_minimal()

Code
DimPlot(seurat_sct, reduction = "pca", group.by = "SelMethod") +
  labs(title = "") +
  theme_minimal()

Code
DimPlot(seurat_sct, reduction = "umap", group.by = "SelMethod") +
  labs(title = "") +
  theme_minimal()

Code
library(patchwork)
p1 <- VlnPlot(seurat_sct, features = "nCount_SCT") + NoLegend()
p2 <- FeaturePlot(seurat_sct, features = "nCount_SCT", label = TRUE) + NoLegend()
p1 + p2 + plot_layout(ncol = 2)

Code
p1 <- VlnPlot(seurat_sct, features = "nFeature_SCT") + NoLegend()
p2 <- FeaturePlot(seurat_sct, features = "nFeature_SCT", label = TRUE) + NoLegend()
p1 + p2 + plot_layout(ncol = 2)

Code
p1 <- VlnPlot(seurat_sct, features = "percent.mt") + NoLegend()
p2 <- FeaturePlot(seurat_sct, features = "percent.mt", label = TRUE) + NoLegend()
p1 + p2 + plot_layout(ncol = 2)

Code
p1 <- VlnPlot(seurat_sct, features = "log10genes_per_UMI") + NoLegend()
p2 <- FeaturePlot(seurat_sct, features = "log10genes_per_UMI", label = TRUE) + NoLegend()
p1 + p2 + plot_layout(ncol = 2)

Summary

After clustering, we have a dataset normalized and scaled using SCTransform, and identified 13 clusters.

Parameters

This table describes parameters used and set in this document.

Code
library(DT)
res <- 0.2
resolutions <- seq(0, 1, 0.1)

params <- list(
  list(
    Parameter = "Number of genes selected by the VST method",
    Value = "3000"
  ),
  list(
    Parameter = "Number of genes selected by the SCT method",
    Value = "3000"
  ),
  list(
    Parameter = "Number of principal components for VST object clustering",
    Value = 18
  ),
  list(
    Parameter = "Number of principal components for SCT object clustering",
    Value = 13
  ),
  list(
    Parameter = "Number of neighbours for nearest neighbor graph",
    Value = 30
  ),
  list(
    Parameter = "Range of possible clustering resolutions",
    Value = "0-0.9"
  ),
  list(
    Parameter = "Method chosen for downstream analysis",
    Value = "SCTransform"
  ),
  list(
    Parameter = "Selected resolution parameter for clustering",
    Value = res
  ),
  list(
    Parameter = "Number of clusters produced by selected resolution",
    Value = "13"
  )
)

# Convert each sublist to a data frame and bind them together
params_df <- do.call(rbind, lapply(params, function(x) {
  data.frame(Parameter = x$Parameter, Value = x$Value, stringsAsFactors = FALSE)
}))

datatable(
  params_df,
  options = list(pageLength = 10),
  rownames = TRUE,
)
Code
#write.csv(params_df, file="./output/data/03.2_clustering/03.2_SI_clustering_summary.csv", row.names = FALSE)

Output files

This table describes the output files produced by this document.

Code
saved_files <- extract_saved_files("./analysis/03.2_clustering.qmd")
print(saved_files)
write.csv(saved_files, file = paste0(proj_dir, "/output/data/03.2_clustering/03.2_SI_saved_files_summary.csv"))
Code
saved_files <- read.csv(file = paste0(proj_dir, "/output/data/03.2_clustering/03.2_SI_saved_files_summary.csv"))
params <- jsonlite::toJSON(saved_files, pretty = TRUE)
knitr::kable(jsonlite::fromJSON(params))
X File Directory Description
1 seurat_sct file=./output/processed/03.2_SI_seurat_sct.Robj full SCT seurat obj
2 pvm_sct, file=paste0(sobj_dir,tag _pvm_sct.Robj) PVM subsetted obj, SCTransformed
3 pvm_vst, file=paste0(sobj_dir,tag _pvm_vst.Robj) PVM subsetted obj, VST for normalization and scaling
4 seurat_sct, file = paste0(sobj_dir 03.2_SI_clean_sobj.Robj) full SCT seurat obj, RNA layer normalized and scaled

Session information

Code
devtools::session_info()
─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.3.3 (2024-02-29)
 os       macOS Sonoma 14.6.1
 system   x86_64, darwin20
 ui       X11
 language (EN)
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       Europe/Vienna
 date     2025-03-04
 pandoc   3.1.1 @ /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/ (via rmarkdown)

─ Packages ───────────────────────────────────────────────────────────────────
 ! package              * version    date (UTC) lib source
 P abind                  1.4-8      2024-09-12 [?] CRAN (R 4.3.3)
   beeswarm               0.4.0      2021-06-01 [1] RSPM (R 4.3.0)
   Biobase              * 2.62.0     2023-10-24 [1] Bioconductor
   BiocGenerics         * 0.48.1     2023-11-01 [1] Bioconductor
 P BiocManager            1.30.25    2024-08-28 [?] CRAN (R 4.3.3)
 P bitops                 1.0-9      2024-10-03 [?] CRAN (R 4.3.3)
   bslib                  0.8.0      2024-07-29 [1] RSPM (R 4.3.0)
 P cachem                 1.1.0      2024-05-16 [?] CRAN (R 4.3.3)
   cli                    3.6.3      2024-06-21 [1] RSPM (R 4.3.0)
 P cluster                2.1.6      2023-12-01 [?] CRAN (R 4.3.3)
 P clustree             * 0.5.1      2023-11-05 [?] CRAN (R 4.3.0)
 P codetools              0.2-19     2023-02-01 [?] CRAN (R 4.3.3)
 P colorspace             2.1-1      2024-07-26 [?] CRAN (R 4.3.3)
 P cowplot              * 1.1.3      2024-01-22 [?] CRAN (R 4.3.2)
 P crayon                 1.5.3      2024-06-20 [?] CRAN (R 4.3.3)
 P crosstalk              1.2.1      2023-11-23 [?] CRAN (R 4.3.0)
 P data.table             1.16.4     2024-12-06 [?] RSPM
   DelayedArray           0.28.0     2023-10-24 [1] Bioconductor
 P deldir                 2.0-4      2024-02-28 [?] CRAN (R 4.3.2)
 P devtools               2.4.5      2022-10-11 [?] CRAN (R 4.3.0)
   digest                 0.6.37     2024-08-19 [1] RSPM (R 4.3.0)
 P dotCall64              1.2        2024-10-04 [?] CRAN (R 4.3.3)
 P dplyr                * 1.1.4      2023-11-17 [?] CRAN (R 4.3.0)
 P DT                   * 0.33       2024-04-04 [?] CRAN (R 4.3.2)
 P ellipsis               0.3.2      2021-04-29 [?] CRAN (R 4.3.0)
   evaluate               1.0.1      2024-10-10 [1] RSPM (R 4.3.0)
 P farver                 2.1.2      2024-05-13 [?] CRAN (R 4.3.3)
 P fastDummies            1.7.4      2024-08-16 [?] RSPM
 P fastmap                1.2.0      2024-05-15 [?] CRAN (R 4.3.3)
 P fitdistrplus           1.2-1      2024-07-12 [?] CRAN (R 4.3.3)
 P forcats              * 1.0.0      2023-01-29 [?] RSPM
   fs                     1.6.5      2024-10-30 [1] RSPM (R 4.3.0)
 P future                 1.34.0     2024-07-29 [?] CRAN (R 4.3.3)
 P future.apply           1.11.3     2024-10-27 [?] CRAN (R 4.3.3)
 P generics               0.1.3      2022-07-05 [?] CRAN (R 4.3.0)
   GenomeInfoDb         * 1.38.8     2024-03-15 [1] Bioconductor 3.18 (R 4.3.3)
   GenomeInfoDbData       1.2.11     2024-12-25 [1] Bioconductor
   GenomicRanges        * 1.54.1     2023-10-29 [1] Bioconductor
   ggbeeswarm             0.7.2      2023-04-29 [1] RSPM (R 4.3.0)
 P ggforce              * 0.4.2      2024-02-19 [?] CRAN (R 4.3.2)
 P ggplot2              * 3.5.1      2024-04-23 [?] CRAN (R 4.3.2)
 P ggraph               * 2.2.1      2024-03-07 [?] CRAN (R 4.3.2)
   ggrastr                1.0.2      2023-06-01 [1] RSPM (R 4.3.3)
 P ggrepel              * 0.9.6      2024-09-07 [?] CRAN (R 4.3.3)
 P ggridges               0.5.6      2024-01-23 [?] CRAN (R 4.3.2)
 P globals                0.16.3     2024-03-08 [?] CRAN (R 4.3.2)
   glue                   1.8.0      2024-09-30 [1] RSPM (R 4.3.0)
 P goftest                1.2-3      2021-10-07 [?] CRAN (R 4.3.0)
 P graphlayouts           1.2.1      2024-11-18 [?] CRAN (R 4.3.3)
 P gridExtra              2.3        2017-09-09 [?] CRAN (R 4.3.0)
 P gtable                 0.3.6      2024-10-25 [?] CRAN (R 4.3.3)
 P hms                    1.1.3      2023-03-21 [?] CRAN (R 4.3.0)
 P htmltools              0.5.8.1    2024-04-04 [?] CRAN (R 4.3.2)
 P htmlwidgets            1.6.4      2023-12-06 [?] CRAN (R 4.3.0)
 P httpuv                 1.6.15     2024-03-26 [?] CRAN (R 4.3.2)
 P httr                   1.4.7      2023-08-15 [?] CRAN (R 4.3.0)
 P ica                    1.0-3      2022-07-08 [?] CRAN (R 4.3.0)
 P igraph                 2.1.2      2024-12-07 [?] RSPM
   IRanges              * 2.36.0     2023-10-24 [1] Bioconductor
 P irlba                  2.3.5.1    2022-10-03 [?] CRAN (R 4.3.0)
 P jquerylib              0.1.4      2021-04-26 [?] CRAN (R 4.3.0)
   jsonlite               1.8.9      2024-09-20 [1] RSPM (R 4.3.0)
 P KernSmooth             2.23-24    2024-05-17 [?] CRAN (R 4.3.3)
   knitr                * 1.49       2024-11-08 [1] RSPM (R 4.3.0)
 P labeling               0.4.3      2023-08-29 [?] CRAN (R 4.3.0)
 P later                  1.4.1      2024-11-27 [?] RSPM
 P lattice                0.22-5     2023-10-24 [?] CRAN (R 4.3.3)
 P lazyeval               0.2.2      2019-03-15 [?] CRAN (R 4.3.0)
 P leiden                 0.4.3.1    2023-11-17 [?] CRAN (R 4.3.0)
 P lifecycle              1.0.4      2023-11-07 [?] CRAN (R 4.3.0)
 P listenv                0.9.1      2024-01-29 [?] CRAN (R 4.3.2)
 P lmtest                 0.9-40     2022-03-21 [?] CRAN (R 4.3.0)
 P lubridate            * 1.9.4      2024-12-08 [?] RSPM
   magrittr               2.0.3      2022-03-30 [1] RSPM (R 4.3.0)
 P MASS                   7.3-60.0.1 2024-01-13 [?] CRAN (R 4.3.3)
 P Matrix                 1.6-5      2024-01-11 [?] CRAN (R 4.3.3)
   MatrixGenerics       * 1.14.0     2023-10-24 [1] Bioconductor
 P matrixStats          * 1.4.1      2024-09-08 [?] CRAN (R 4.3.3)
 P memoise                2.0.1      2021-11-26 [?] CRAN (R 4.3.0)
 P mime                   0.12       2021-09-28 [?] CRAN (R 4.3.0)
 P miniUI                 0.1.1.1    2018-05-18 [?] CRAN (R 4.3.0)
 P munsell                0.5.1      2024-04-01 [?] CRAN (R 4.3.2)
 P nlme                   3.1-164    2023-11-27 [?] CRAN (R 4.3.3)
 P parallelly             1.41.0     2024-12-18 [?] RSPM
 P patchwork            * 1.3.0      2024-09-16 [?] CRAN (R 4.3.3)
 P pbapply                1.7-2      2023-06-27 [?] CRAN (R 4.3.0)
 P pillar                 1.10.0     2024-12-17 [?] RSPM
 P pkgbuild               1.4.5      2024-10-28 [?] CRAN (R 4.3.3)
 P pkgconfig              2.0.3      2019-09-22 [?] CRAN (R 4.3.0)
 P pkgload                1.4.0      2024-06-28 [?] RSPM
 P plotly                 4.10.4     2024-01-13 [?] CRAN (R 4.3.0)
 P plyr                   1.8.9      2023-10-02 [?] CRAN (R 4.3.0)
 P png                    0.1-8      2022-11-29 [?] CRAN (R 4.3.0)
 P polyclip               1.10-7     2024-07-23 [?] RSPM
 P profvis                0.4.0      2024-09-20 [?] CRAN (R 4.3.3)
 P progressr              0.15.1     2024-11-22 [?] RSPM
 P promises               1.3.2      2024-11-28 [?] RSPM
 P purrr                * 1.0.2      2023-08-10 [?] CRAN (R 4.3.0)
 P R6                     2.5.1      2021-08-19 [?] CRAN (R 4.3.0)
 P RANN                   2.6.2      2024-08-25 [?] RSPM
 P RColorBrewer           1.1-3      2022-04-03 [?] CRAN (R 4.3.0)
 P Rcpp                   1.0.13-1   2024-11-02 [?] CRAN (R 4.3.3)
 P RcppAnnoy              0.0.22     2024-01-23 [?] CRAN (R 4.3.2)
 P RcppHNSW               0.6.0      2024-02-04 [?] CRAN (R 4.3.2)
   RCurl                  1.98-1.16  2024-07-11 [1] RSPM (R 4.3.0)
 P readr                * 2.1.5      2024-01-10 [?] RSPM
 P remotes                2.5.0      2024-03-17 [?] RSPM
   renv                   1.0.11     2024-10-12 [1] RSPM (R 4.3.0)
 P reshape2               1.4.4      2020-04-09 [?] CRAN (R 4.3.0)
 P reticulate             1.40.0     2024-11-15 [?] CRAN (R 4.3.3)
   rlang                  1.1.4      2024-06-04 [1] RSPM (R 4.3.0)
   rmarkdown              2.29       2024-11-04 [1] RSPM (R 4.3.0)
 P ROCR                   1.0-11     2020-05-02 [?] CRAN (R 4.3.0)
 P RSpectra               0.16-2     2024-07-18 [?] RSPM
 P rstudioapi             0.17.1     2024-10-22 [?] CRAN (R 4.3.3)
 P Rtsne                  0.17       2023-12-07 [?] CRAN (R 4.3.0)
   S4Arrays               1.2.1      2024-03-06 [1] Bioconductor 3.18 (R 4.3.3)
   S4Vectors            * 0.40.2     2023-11-23 [1] Bioconductor
 P sass                   0.4.9      2024-03-15 [?] CRAN (R 4.3.2)
 P scales                 1.3.0      2023-11-28 [?] CRAN (R 4.3.0)
 P scattermore            1.2        2023-06-12 [?] CRAN (R 4.3.0)
 P sctransform            0.4.1      2023-10-19 [?] CRAN (R 4.3.0)
 P sessioninfo            1.2.2      2021-12-06 [?] CRAN (R 4.3.0)
 P Seurat               * 5.1.0      2024-05-10 [?] CRAN (R 4.3.3)
 P SeuratObject         * 5.0.2      2024-05-08 [?] CRAN (R 4.3.2)
 P shiny                  1.10.0     2024-12-14 [?] RSPM
   SingleCellExperiment * 1.24.0     2023-10-24 [1] Bioconductor
 P sp                   * 2.1-4      2024-04-30 [?] CRAN (R 4.3.3)
 P spam                   2.11-0     2024-10-03 [?] CRAN (R 4.3.3)
   SparseArray            1.2.4      2024-02-11 [1] Bioconductor 3.18 (R 4.3.2)
 P spatstat.data          3.1-4      2024-11-15 [?] CRAN (R 4.3.3)
 P spatstat.explore       3.3-3      2024-10-22 [?] CRAN (R 4.3.3)
 P spatstat.geom          3.3-4      2024-11-18 [?] RSPM
 P spatstat.random        3.3-2      2024-09-18 [?] CRAN (R 4.3.3)
 P spatstat.sparse        3.1-0      2024-06-21 [?] RSPM
 P spatstat.univar        3.1-1      2024-11-05 [?] CRAN (R 4.3.3)
 P spatstat.utils         3.1-1      2024-11-03 [?] CRAN (R 4.3.3)
 P stringi                1.8.4      2024-05-06 [?] CRAN (R 4.3.2)
   stringr              * 1.5.1      2023-11-14 [1] RSPM (R 4.3.0)
   SummarizedExperiment * 1.32.0     2023-10-24 [1] Bioconductor
 P survival               3.5-8      2024-02-14 [?] CRAN (R 4.3.3)
 P tensor                 1.5        2012-05-05 [?] CRAN (R 4.3.0)
 P tibble               * 3.2.1      2023-03-20 [?] CRAN (R 4.3.0)
 P tidygraph              1.3.1      2024-01-30 [?] CRAN (R 4.3.2)
 P tidyr                * 1.3.1      2024-01-24 [?] CRAN (R 4.3.2)
 P tidyselect             1.2.1      2024-03-11 [?] CRAN (R 4.3.2)
 P tidyverse            * 2.0.0      2023-02-22 [?] CRAN (R 4.3.0)
 P timechange             0.3.0      2024-01-18 [?] CRAN (R 4.3.0)
 P tweenr                 2.0.3      2024-02-26 [?] CRAN (R 4.3.2)
 P tzdb                   0.4.0      2023-05-12 [?] CRAN (R 4.3.0)
 P urlchecker             1.0.1      2021-11-30 [?] CRAN (R 4.3.0)
 P usethis                3.1.0      2024-11-26 [?] CRAN (R 4.3.3)
 P uwot                   0.2.2      2024-04-21 [?] RSPM
 P vctrs                  0.6.5      2023-12-01 [?] CRAN (R 4.3.0)
   vipor                  0.4.7      2023-12-18 [1] RSPM (R 4.3.0)
 P viridis              * 0.6.5      2024-01-29 [?] CRAN (R 4.3.2)
 P viridisLite          * 0.4.2      2023-05-02 [?] CRAN (R 4.3.0)
 P withr                  3.0.2      2024-10-28 [?] CRAN (R 4.3.3)
   xfun                   0.49       2024-10-31 [1] RSPM (R 4.3.0)
 P xtable                 1.8-4      2019-04-21 [?] CRAN (R 4.3.0)
   XVector                0.42.0     2023-10-24 [1] Bioconductor
   yaml                   2.3.10     2024-07-26 [1] RSPM (R 4.3.0)
   zlibbioc               1.48.2     2024-03-13 [1] Bioconductor 3.18 (R 4.3.3)
 P zoo                    1.8-12     2023-04-13 [?] CRAN (R 4.3.0)

 [1] /Users/nami/Desktop/sterile_inflammation/renv/library/R-4.3/x86_64-apple-darwin20
 [2] /Users/nami/Library/Caches/org.R-project.R/R/renv/sandbox/R-4.3/x86_64-apple-darwin20/b06620f4

 P ── Loaded and on-disk path mismatch.

──────────────────────────────────────────────────────────────────────────────